.TITLE TTODN .IDENT /06.01/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; ; 30-JAN-78 PETER WANNHEDEN ; ; PREVIOUSLY MODIFIED BY: ; ; P. WANNHEDEN ; D. R. DONCHIN ; T. LEKAS ; S. ADAMS ; ; ; MODIFIED BY: ; ; L. KOGAN 06-JUN-85 05.06 ; LK608 -- FIX ^R PROCESSING AFTER IO.WBT ; ; L. KOGAN 02-NOV-85 06.01 ; LK705 -- MAKE 11M AND 11M+ TTDRV MODULES IDENTICAL ; .PSECT MAP5.6 ; ;+ ; ODONE - OUTPUT DONE PROCESSING. ; ; INPUT: ; R5 POINTER TO U.TSTA ; ; OUTPUT: ; THE DATABASE IS UPDATED AS REQUIRED. ; ANOTHER OUTPUT OPERATION MAY BE INITIATED. ; ; REGISTERS ALTERED: R2,R3,R4 ;- ; ; .ENABL LSB ; .SBTTL ODONE - OUTPUT DONE ; ODONE:: BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT INTERRUPT UNEXPECTED? ;;;(COULD HAPPEN FOR EXAMPLE IF WE COME ;;;HERE WHEN ABORTING OUTPUT) BNE 40$ ;;;Y - JUMP ASSUME US.OIU,1 INCB U.STS-U.TSTA(R5) ;;;NOW IT IS UNEXPECTED 10$: ;;;REFERENCE LABEL .IF DF T$$SPL MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;;;MAP UCBX AND TABUF MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPL MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX BEQ 40$ ;;;NONE - JUMP (THIS CAN ONLY HAPPEN IF ;;;WE COME HERE TO DO A SPECIAL ECHO ;;;SUCH AS BELL) .IFTF ;T$$SPL CLRB U.TOTI(R4) ;;;CLEAR OUTPUT TIMER TST U.TCO(R4) ;;;DOING TASK OUTPUT? BNE 20$ ;;;Y - JUMP BIT #S2.BEL,2(R5) ;;;BELL ECHO REQUESTED? BNE BELL1 ;;;Y - JUMP ASSUME S1.OBY,100 ;S1.OBY MUST BE IN LOW BYTE BICB #S1.OBY,@R5 ;;;SET OUTPUT FREE ASSUME S1.IBY,200 BPL CFGRQ ;;;INPUT FREE - JUMP TSTB U.TISV(R4) ;;; CHECK IF IN THE MIDDLE OF ^R PROCESSING BNE LK1 ;;; YES GOTO FINISH ECHOING INPUT BUFFER BIT #S1.DSI,@R5 ;;;INPUT PROCESSING DISABLED? BNE 40$ ;;;Y - JUMP LK1: CALL ECHD1 ;;;INPUT BUSY - ENTER INPUT ROUTINES ;;;FALL THRU TO "NXTIC" .PAGE .SBTTL NXTIC - GET NEXT INPUT CHARACTER FROM TYPE-AHEAD BUFFER ; ;+ ; NXTIC - GET NEXT INPUT CHARACTER FROM TYPE-AHEAD BUFFER. ; ; INPUT: ; R5 POINTER TO U.TSTA ; ; OUTPUT: ; IF A CHARACTER CAN BE OBTAINED FROM THE TYPE-AHEAD BUFFER, ; AND THE CHARACTER CAN BE PROCESSED, IT IS REMOVED FROM ; THE TYPE-AHEAD BUFFER AND ICHAR2 IS CALLED TO PROCESS ; THE CHARACTER. ; ; IF THERE IS CURRENTLY AN IO.RSD OUTSTANDING GET THE CHARACTER ; FROM THE APPROPRIATE TYPEAHEAD BUFFER. ; ; ELSE A RETURN IS EXECUTED. ;- ; ; NXTIC:: .IF DF B$$MAP ASSUME B$$MAP,1 ;;;THERE CAN ONLY BE ONE TERMINAL ;;;THAT SUPPORTS IO.RSD CURRENTLY CALL RSDPRC ;;;CAN WE PROCESS A SPECIAL DATA ;;;CHARACTER IF ANY? BCC 12$ ;;;Y - GO PROCESS IT .ENDC ;B$$MAP CALL GCTAB ;;;GET A CHARACTER FROM TABUF BCS 15$ ;;;IF CS, NONE THERE...CHECK INPUT TIMEOUT CALL IPROC ;;;CAN WE PROCESS IT? BCS 40$ ;;;N - RETURN CALL RCTAB ;;;Y - REMOVE CHARACTER FROM TABUF 11$: CALL ICHAR2 ;;;PROCESS CHARACTER BR NXTIC ;;;LOOP .IF DF B$$MAP ; ; R4 CONTAINS THE I/O PACKET ADDRESS OF AN IO.RSD FROM RSDPRC ; 12$: MOV I.PRM+10(R4),R2 ;;;GET THE DATA TYPE ASL R2 ;;;MAKE IT A WORD INDEX MOV T.RSDT(R2),R2 ;;;GET THE ADDRESS OF THE APPROPRIATE ;;;TYPEAHEAD BUFFER ; ; GET THE CHARACTER, IF ANY, FROM THE SPECIAL TYPEAHEAD BUFFER ; INC R2 ;;;POINT TO RETRIEVE POINTER TSTB 1(R2) ;;;BUFFER EMPTY? BEQ 40$ ;;;Y - NO MORE CHARACTERS, TRY NORMAL TYPEAHEAD MOVB (R2),R3 ;;;GET RETRIEVE POINTER INCB (R2) ;;;UPDATE THE RETRIEVAL POINTER CMPB (R2),2(R2) ;;;WRAP-AROUND? BNE 13$ ;;;N - JUMP CLRB (R2) ;;;Y - RESET POINTER TO START OF BUFFER 13$: DECB 1(R2) ;;;DECREMENT ACTIVE COUNT ADD #3,R2 ;;;POINT TO THE DATA ADD R2,R3 ;;;POINT TO NEXT CHARACTER TO RETRIEVE CLR R2 ;;;PREPARE FOR BISB BISB (R3),R2 ;;;PUT THE CHARACTER IN THE LOW BYTE BR 11$ ;;;GO PROCESS THE CHARACTER .ENDC ;B$$MAP ; ; THERE IS NOTHING IN THE TYPEAHEAD BUFFER. SEE IF WE NEED TO TIME-OUT THE ; INPUT REQUEST. ; 15$: BIT #S5.ITI,U.TST5-U.TSTA(R5) ;;;IMMEDIATE TIMEOUT ON INPUT? BEQ 40$ ;;;IF EQ, NO...ALL DONE .IF DF T$$SPL MOV #120000,R4 ;;;SET UCBX POINTER .IFF ;T$$SPL MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX POINTER BEQ 40$ ;;;IF EQ, NONE...EXIT .ENDC ;T$$SPL ASSUME U.TCI,0 TST (R4) ;;;IS THERE A CURRENT INPUT REQUEST PACKET? BEQ 40$ ;;;IF EQ, NO...GIVE UP TST @(R4) ;;;IS THERE ALREADY A STATUS? BNE 40$ ;;;BR IF YES MOV #IS.TMO,@(R4)+ ;;;SET A COMPLETION STATUS CALLR IDONE ;;;COMPLETE INPUT REQUEST WITH A TIMEOUT .PAGE .SBTTL CFGRQ - CONDITIONALLY FORK TO GET A REQUEST PACKET FROM QUEUE ; ;+ ; CFGRQ - CONDITIONALLY FORK TO GET A REQUEST PACKET FROM QUEUE. ; ; INPUT: ; R5 POINTER TO U.TSTA ; ; OUTPUT: ; IF THERE IS A PACKET IN THE QUEUE THAT MAY BE PROCESSED NOW, ; A FORK REQUEST IS QUEUED TO GET A REQUEST PACKET. ;- ; ; CFGRQ:: CALL TSTRQ ;;;TEST I/O QUEUE ;;;RETURN IF NOTHING WORTH FORKING IN QUEUE MOV #FR.GRQ,R3 ;;;FORK/GET REQUEST PACKET BR 30$ ;;; ; 20$: MOV #FR.ORD,R3 ;;;FORK/OUTPUT REQUEST DONE (AT LEAST PARTIALLY) 30$: CALLR FORK ;;;QUEUE FORK REQUEST ; ; .SBTTL BELL - OUTPUT A BELL ; ;+ ; BELL - OUTPUT A BELL. ; ; INPUT: ; R5 POINTER TO U.TSTA ; ; OUTPUT: ; IF ECHO IS SUPPRESSED, IMMEDIATE RETURN (NO ACTION). ; ELSE A BELL IS OUTPUT IF POSSIBLE, OR FLAGGED FOR ; OUTPUT AT FIRST OPPORTUNITY. ; ; REGISTERS ALTERED: R2,R3,R4 ;- ; ; BELLL:: CALL LOCKI ;LOCK OUT INTERRUPTS BELL:: BIT #S1.RNE,@R5 ;;;ECHO SUPPRESSED? BNE 40$ ;;;Y - RETURN ; ; ; IF TRANSMITTER IS FREE, THE SPECIAL ECHO IS STARTED. ; IF TRANSMITTER IS BUSY, THE FLAG IS SET IN U.TSTA ; TO FORCE THE SPECIAL ECHO AT FIRST OPPORTUNITY. ; ; BIS #S2.BEL,2(R5) ;;;SET CR BIT #S1.DSI!S1.OBY,@R5 ;;;OUTPUT BUSY OR FORK PROCESSING BUSY? BEQ 10$ ;;;NEITHER - DO IT NOW ; ; A SPECIAL ECHO MAY BE DELAYED BECAUSE FORK PROCESSING IS BUSY (S1.DSI SET). ; 40$: RETURN ;;;Y - WAIT ; .DSABL LSB ; ; BELL1: BIC #S2.BEL,2(R5) ;;;CLEAR BELL FLAG MOV #ASBELL,R3 ;;;POINT TO BELL CHAR. BR ECHCHR ;;;GO AND OUTPUT A SINGLE CHARACTER ; ; .PAGE .SBTTL ECHSTR, ECHCHR - ECHO A STRING OR A CHARACTER ; ;+ ; ECHSTR - ECHO A STRING. ; ; INPUT: ; R2 STRING LENGTH ; R3 POINTER TO THE STRING ; R4 POINTER TO UCBX ; R5 POINTER TO U.TSTA ; ; ALTERNATE ENTRY - ECHCHR ; SAME AS ECHSTR, BUT PRESETS R2 TO 1 TO ECHO 1 CHARACTER. ; ALTERNATE ENTRY - ECHRL ; SAME AS ECHCHR, BUT LOCKS OUT INTERRUPTS BEFORE THE OPERATION ; AND ALLOWS INTERRUPTS BEFORE RETURN. ; ; REGISTERS ALTERED: R2,R3,R4 ;- ; ; ECHRL:: CALL LOCKI ;LOCK OUT INTERRUPTS ECHCHR::MOV #1,R2 ;;;STRING LENGTH = 1 .IF DF T$$ACD BR ECHSTR ;;;SET UP UCBX FOR BUFFERED ECHO MECHO:: BIC #S2.OBF,2(R5) ;;;INDICATE NON-BUFFERED MULTI-ECHO CLR U.TFOB(R4) ;;;SET EMPTY MULTI-ECHO BUFFER ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+2 BR ECHSET ;;;SET UP UCBX FOR MULTI-ECHO ECHSTR::BIS #S2.OBF,2(R5) ;;;SET UP UCBX FOR NON-MULTI-ECHO ADD #U.TOP,R4 ;;;POINT TO U.TOP .IFF ECHSTR::ADD #U.TOP,R4 ;;;POINT TO U.TOP .IFTF CLR (R4)+ ;;;U.TOP <-- 0 (ECHO) ECHSET: MOV R3,(R4)+ ;;;U.TOP+2 <-- BUFFER ADDRESS ASSUME U.TOC,U.TOP+4 MOV R2,@R4 ;;;U.TOC <-- BYTE COUNT BR STARTX ;;;START TRANSMISSION ; ; ;+ ; STARTX - START TRANSMISSION OF A BUFFER. ; ; INPUT: ; R5 POINTER TO U.TSTA ; U.TOP+2 BUFFER ADDRESS ; U.TOC BYTE COUNT ; ; CALLS CONTROLLER-DEPENDENT ROUTINE TO START OUTPUT. ; NOTE - MUST BE CALLED ON DEVICE PRIORITY! ; ; ALTERNATE ENTRY: STAXL - START TRANSMISSION OF A LIST OF BUFFERS. ; ; INPUT: ; R4 POINTER TO UCBX ; R5 POINTER TO UCB ; U.TFOB POINTER TO FIRST OUTPUT BUFFER ; EACH BUFFER CONTAINS A LINK TO THE NEXT BUFFER IN THE ; FIRST WORD, AND BYTE COUNT IN THE SECOND WORD. ; ; REGISTERS ALTERED: R2,R3,R4 ;- ; ; STAXL:: MOV U.TFOB(R4),R2 ;;;GET FIRST BUFFER ADD #U.TOP,R4 ;;;POINT TO U.TOP CALL UPUB ;;;SET UP UCBX FOR OUTPUT .IFT BIS #S2.OBF,2(R5) ;;;INDICATE BUFFERED OUTPUT .ENDC STARTX::BIS #S1.OBY,@R5 ;;;SET OUTPUT BUSY ASSUME US.OIU,1 DECB U.STS-U.TSTA(R5) ;;;SET OUTPUT INTERRUPT EXPECTED .IFT ;T$$SPL MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPL MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX .ENDC ;T$$SPL MOVB OPTIMR,U.TOTI(R4) ;;;INITIALIZE OUTPUT TIMER ASSUME CT.STA,0 CLR R2 ;;;SET INDEX FOR "START OUTPUT" CALLR CTRD ;;;CALL CONTROLLER DEPENDENT ROUTINE ; ; .END